package github.ziwukun.jsonql.lang;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

/**
 * PropSort 和 Json转换相关
 * @author Hugo.Yu
 */
class SelectItemJson {
	
	static SelectItemImpl readJson(String json) {
		// 直接字符串
		if(!JSONUtil.isJson(json)) {
			return new SelectItemImpl(json, null);
		}
		
		// 非直接属性
		// {"name":["firstname","lastname"]}
		JSONObject itemJson = new JSONObject(json);
		if(itemJson.keySet().size() != 1) {
			throw new JsonQLFormatException("@select语句中，对象的key值有且必须有一个",
				"@select语句语法错误-" + json);
		}
		String key = itemJson.keySet().iterator().next();
		Object value = itemJson.get(key);
		
		if(value == null) {
			throw new JsonQLFormatException("@select语句中，对象的value值不能为null",
				"@select语句语法错误-" + json);
		}
		return new SelectItemImpl(key, SelectJson.readJson(value.toString()));
	}
	
	static String writeJson(SelectItem selectItem) {
		if(selectItem.isChildEmpty()) {
			return selectItem.prop();
		}
		
		else{
			JSONArray array = new JSONArray();
			for (SelectItem item : selectItem.childs().listItems()) {
				array.add(item.isChildEmpty()?
					item.prop():new JSONObject(item.toJSONQL()));
			}
			
			JSONObject json = new JSONObject();
			json.set(selectItem.prop(), array);
			return json.toString();
		}
	}
}
